import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';


///通知管理工具
final  FlutterLocalNotificationsPlugin np = FlutterLocalNotificationsPlugin();
class MyNotification {


  /// main 初始化
  static init() async {
    var android = const AndroidInitializationSettings("@mipmap/ic_launcher");
    var ios = const DarwinInitializationSettings();

    await np.initialize(InitializationSettings(android: android, iOS: ios),
        onDidReceiveNotificationResponse: selectNotification, onDidReceiveBackgroundNotificationResponse: onDidReceiveBackgroundNotificationResponse);
  }

  //点击通知回调事件
  static void selectNotification(NotificationResponse payload) async {
    if (payload != null) {
      debugPrint('notification payload: $payload');

      // todo 这里根据自己的业务处理


    }
  }

  //点击通知回调事件
  static void onDidReceiveBackgroundNotificationResponse(NotificationResponse payload) async {
    if (payload != null) {
      debugPrint('notification payload: $payload');

      // todo 这里根据自己的业务处理


    }
  }

  /// params为点击通知时，可以拿到的参数，title和body仅仅是展示作用
  /// Map params = {};
  /// params['type'] = "100";
  /// params['id'] = "10086";
  /// params['content'] = "content";
  /// notification.send("title", "content",params: json.encode(params));
  ///
  /// notificationId指定时，不在根据时间生成
  void send(String title, String body, {int? notificationId, String? params}) {
    // 构建描述
    var androidDetails = const AndroidNotificationDetails(
      //区分不同渠道的标识
      'channelId',

      //channelName渠道描述不要随意填写，会显示在手机设置，本app 、通知列表中，
      //规范写法根据业务：比如： 重要通知，一般通知、或者，交易通知、消息通知、等
      'channelName',

      //通知的级别
      importance: Importance.max,
      priority: Priority.high,

      //可以单独设置每次发送通知的图标
      // icon: ''

      //显示进度条 3个参数必须同时设置
      // progress: 19,
      // maxProgress: 100,
      // showProgress: true
    );
    //ios配置选项相对较少
    var iosDetails = const DarwinNotificationDetails();
    var iOSPlatformChannelSpecifics = const DarwinNotificationDetails(
      sound: 'default',
      presentAlert: true,
      presentBadge: true,
      presentSound: true,
      badgeNumber: 1,
    );
    var details = NotificationDetails(android: androidDetails, iOS: iOSPlatformChannelSpecifics);

    // 显示通知, 第一个参数是id,id如果一致则会覆盖之前的通知
    // String? payload, 点击时可以拿到的参数
    int id= notificationId ?? DateTime.now().millisecondsSinceEpoch >> 10;
    np.show(id,
        title, body, details,
        payload: params);
  }

  ///清除所有通知
  void cleanNotification() {
    np.cancelAll();
  }

  ///清除指定id的通知
  /// `tag`参数指定Android标签。 如果提供，
  /// 那么同时匹配 id 和 tag 的通知将会
  /// 被取消。 `tag` 对其他平台没有影响。
  void cancelNotification(int id, {String? tag}) {
    np.cancel(id, tag: tag);
  }
}

var notification = MyNotification();



// void testNo() async {
//   //send 之前先判断权限
//   // 某些权限不会显示要求用户允许或拒绝请求的权限的对话框。
//   // 这是因为正在检索应用程序的操作系统设置以获得相应的权限。
//   // 设置的状态将决定权限是granted还是denied。
//   // 以下权限将不显示对话框：
//   // 通知
//   // 蓝牙
//   if (await Permission.notification.request().isGranted) {
//     debugPrint("isGranted true");
//     //点击发送通知
//     Map params = {};
//     params['type'] = 200;
//     params['id'] = "10086";
//     params['content'] = "content";
//     notification.send("title", "content", params: json.encode(params));
//   } else {
//     debugPrint("isGranted false");
//     //打开应用设置
//     // final flag = await NftDialogUtils.showCommonTipsDialog(context, "请打开设置，勾选通知权限");
//     // if(flag != null && flag){
//     // openAppSettings();
//     // }
//     AppSettings.openAppSettings(type: AppSettingsType.notification);
//   }
// }

